package com.example.threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Tpool2 {
    public static void main(String[] args) {

        // 创建一个固定大小的线程池
        /**
         * 加入到线程池中的线程不需要也不能使用 start() 方法，因为：
         * 线程池接收的任务应该是实现了 Runnable 或 Callable 接口的“任务对象”，而不是你自己 new 出来的 Thread 实例。
         */
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        /**
         * 你传进的是一个已经包装好的 Thread 对象。
         * 而 ExecutorService.execute() 其实期望的是一个 Runnable 任务，并不是你自定义创建的 Thread 对象。
         * 虽然 Thread 实现了 Runnable 接口，因此不会报错，但这样写会混淆职责，并且由你手动 new 的 Thread 实例不会被线程池复用。
         */

        /**
         * 线程池的执行机制：
         * executorService.execute(Runnable task) 被调用
         * 线程池内部从任务队列中取出 Runnable
         * 找到空闲的工作线程（或创建新的，如果还没超过上限）
         * 调用 workerThread.run()，它会去执行你传入的任务
         * 线程不会销毁，继续复用来执行下一个任务
         */

        // 线程1
        /*Thread t1 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "is running!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });*/

        executorService.execute(() -> {
            System.out.println(Thread.currentThread().getName() + "is running!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        // 线程2
        /*Thread t2 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "is running!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });*/

        executorService.execute(() -> {
            System.out.println(Thread.currentThread().getName() + "is running!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        // 线程3
        /*Thread t3 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "is running!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });*/

        executorService.execute(() -> {
            System.out.println(Thread.currentThread().getName() + "is running!");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

//        executorService.execute(t1);
//        executorService.execute(t2);
//        executorService.execute(t3);

        executorService.shutdown();

    }
}
